package com.qin.mybatis.mapper;

import com.qin.mybatis.model.SysRole;
import com.qin.mybatis.model.SysUser;
import com.qin.mybatis.model.SysUserExtend;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @author Leisure
 * create 2022 2022/9/24 20:30
 **/
public interface SysUserMapper {
    /**
     * 通过id查询用户
     * @param id
     * @return
     */
    SysUser selectById(Integer id);

    /**
     * 
     * @return
     */
    List<SysUser> selectAll();

    /**
     * 根据用户id获取角色信息
     * @return
     * @param 
     */
    List<SysUser> selectRoleByUserId(Integer id);

    /**
     * 根据用户id和角色的enable状态获取用户的角色
     * 如果一个参数就不需要加@Param,应该是两个或以上的参数分不清那个先
     * @param userId
     * @param enable
     * @return
     */
    List<SysUser> selectRoleByUserIdAndRoleEnable(@Param("userId") Integer userId,@Param("enabled") Integer enable);

    /**
     * 查询类型是对象
     * 根据用户id和角色的enable状态获取用户的角色
     * @param user
     * @param role
     * @return
     */
    List<SysUser> selectRoleByUserAndRole(@Param("user") SysUser user , @Param("role")SysRole role);

    /**返回行数
     * 新增用户,插入不用从实体类里那所以基本类型即可
     * @param sysUser
     * @return
     */
    int insert(SysUser sysUser);

    /**
     * 新增用户获取数据表id自增
     * @param sysUser
     * @return
     */
    int insertUseGeneratedKeys(SysUser sysUser);

    /**
     * 新增用户-使用selectKey方式
     * @param sysUser
     * @return
     */
    int insertUseSelectKey(SysUser sysUser);

    /**
     * 更新数据
     * 根据主键更新
     * @param sysUser
     * @return
     */
    int updateById(SysUser sysUser);
    
    /**
     * 根据主键删除
     *
     * @param id
     * @return
     */
    int deleteById(Integer id);

    /**
     * 根据对象的主键删除
     *
     * @param sysUser
     * @return
     */
    int deleteBySysUser(SysUser sysUser);

    /**
     * if条件动态查询用户名或邮箱
     * @param sysUser
     * @return
     */
    List<SysUser> selectByUser(SysUser sysUser);

    /**
     * 根据主键选择性更新用户信息
     *
     * @param sysUser
     * @return
     */
    int updateByIdSelective(SysUser sysUser);

    /**
     * 根据传入的参数值动态插入列
     *插入空时插入数据库默认值
     * @param sysUser
     * @return
     */
    int insertSelective(SysUser sysUser);

    /**
     * 根据用户id或用户名查询
     *choose使用
     * @param sysUser
     * @return
     */
    SysUser selectByIdOrUserName(SysUser sysUser);

    /**
     * 根据动态条件查询用户信息(使用Where标签)
     *
     * @param sysUser
     * @return
     */
    List<SysUser> selectByUserWhere(SysUser sysUser);

    /**
     * 根据主键选择性更新用户信息(使用Set标签)
     *
     * @param sysUser
     * @return
     */
    int updateByIdSelectiveSet(SysUser sysUser);

    /**
     * 根据用户id集合查询用户
     *
     * @param idList
     * @return
     */
    List<SysUser> selectByIdList(List<Integer> idList);

    /**
     * 批量插入用户信息
     *
     * @param userList
     * @return
     */
    int insertList(List<SysUser> userList);

    /**
     * 通过Map更新列
     *
     * @param map
     * @return
     */
    int updateByMap(Map<String, Object> map);

    /**
     * 根据用户id获取用户信息和用户的角色信息
     *
     * @param id
     * @return
     */
    SysUserExtend selectUserAndRoleById(Integer id);

    /**
     * 根据用户id获取用户信息和用户的角色信息
     *
     * @param id
     * @return
     */
    SysUserExtend selectUserAndRoleByIdResultMap(Integer id);
    
}
